// @flow

/**
 * flow使用
 * npm i flow-bin
 * npx flow init
 * npx flow
 */

// flow 类型检查
// function sum(a: number, b: number) {
//     return a + b;
// }

// sum(100, 100);
// sum(100, "100");

// flow 类型推断
// function fn (n： number) {
//     return n * n
// }

// fn('123')

// flow 类型注解
// let num :number = 100
// function foo () : number{
//     return 100
// }
// 没有返回值时 将返回值类型设置为void
// function foo () : void{
//     return 100
// }

// flow 原始类型
// const a: string = 'foobar'
// const b: number = Infinity // NaN 100
// const c: boolean = true
// const d: null = null
// const e: void = undefined
// const f: symbol = Symbol()

// 数组
// const arr: Array<number> = [1, 2, 3, 4, 5];
// const arr2: number[] = [1, 2, 3, 4, 5];
// 元组
// const foo: [string, number] = ["foo", 120];
// 对象
// const obj: {foo: string, bar: number} = {foo:  'string', bar:  100}
// const obj1: {foo？:  string, bar: number} = { bar: 100}
// const obj2:{[string]: string} = {}
// obj2.key1 = 'value'
// obj2.key2 = 'value2'
//函数
// function(a: string): string{
//     return a
// }
// function foo(callback: (string, number) => viod) {
//     callback('string', 100)
// }
// foo(function(str, n) {
// })

//特殊类型

// const a: 'foo' = 'foo'
// const type: 'success' | 'warning' | 'danger' = 'success'

// type StringOrNumber = 'string' | 'number'
// cosnt b: StringOrNumber = 'string' // 100

// const c: ?number = null // undefind 100

// mixed 强类型
// any 弱类型
// function fn (value: mixed) {
//     if (typeof value === 'string') {
//         value.substr(1)
//     }
//     if (typeof value === 'number') {
//         value * value
//     }
// }
// function fn (value: any) {
//     value.substr(1)
//     value * value
// }

// 运行环境 API
// const element: HTMLElement | null = document.getElementById('app')